#!/bin/bash

#==============================================================================
# 脚本名称: install-hadoop.sh
# 脚本描述: Apache Hadoop HDFS 3.3.6 单机部署自动化安装脚本
# 作者: 大数据团队
# 版本: 1.0
# 创建日期: 2024-01-01
# 修改记录:
#   2024-01-01: 初始版本
#   2024-01-15: 增加错误处理和日志记录
#==============================================================================

# 设置严格模式
set -euo pipefail

# 全局变量定义
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly LOG_FILE="/var/log/hadoop-install.log"
readonly HADOOP_VERSION="3.3.6"
readonly HADOOP_URL="https://archive.apache.org/dist/hadoop/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz"
readonly JAVA_HOME="${JAVA_HOME:-/usr/lib/jvm/java-11-openjdk}"
readonly HADOOP_HOME="/opt/hadoop"
readonly HADOOP_DATA_DIR="/data/hadoop"

# 颜色定义
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] [INFO]${NC} $*" | tee -a "${LOG_FILE}"
}

log_warn() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] [WARN]${NC} $*" | tee -a "${LOG_FILE}"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR]${NC} $*" | tee -a "${LOG_FILE}" >&2
}

log_debug() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] [DEBUG]${NC} $*" | tee -a "${LOG_FILE}"
}

# 错误处理函数
error_exit() {
    log_error "$1"
    exit 1
}

# 检查是否为 root 用户
check_root() {
    if [[ $EUID -eq 0 ]]; then
        error_exit "请不要使用 root 用户运行此脚本"
    fi
}

# 检查系统要求
check_system_requirements() {
    log_info "检查系统要求..."
    
    # 检查操作系统
    if ! command -v lsb_release &> /dev/null; then
        log_warn "无法检测操作系统版本，请确保使用 CentOS 7.9+ / Ubuntu 20.04+ / RHEL 8+"
    else
        local os_info
        os_info=$(lsb_release -d | cut -f2)
        log_info "操作系统: ${os_info}"
    fi
    
    # 检查 Java 环境
    if ! command -v java &> /dev/null; then
        error_exit "Java 环境未安装，请先安装 OpenJDK 8 或 11"
    fi
    
    local java_version
    java_version=$(java -version 2>&1 | head -n1 | cut -d'"' -f2)
    log_info "Java 版本: ${java_version}"
    
    # 检查内存
    local total_mem
    total_mem=$(free -g | awk '/^Mem:/{print $2}')
    if [[ ${total_mem} -lt 8 ]]; then
        log_warn "系统内存少于 8GB，可能影响性能"
    fi
    log_info "系统内存: ${total_mem}GB"
    
    # 检查磁盘空间
    local available_space
    available_space=$(df / | awk 'NR==2{print $4}')
    if [[ ${available_space} -lt 104857600 ]]; then  # 100GB in KB
        log_warn "根分区可用空间少于 100GB，可能不足"
    fi
    log_info "根分区可用空间: $(df -h / | awk 'NR==2{print $4}')"
    
    log_info "系统要求检查完成"
}

# 创建用户和组
create_hadoop_user() {
    log_info "创建 hadoop 用户和组..."
    
    # 检查用户是否已存在
    if id "hadoop" &>/dev/null; then
        log_info "hadoop 用户已存在，跳过创建"
        return 0
    fi
    
    # 创建 hadoop 组
    if ! getent group hadoop &>/dev/null; then
        sudo groupadd hadoop
        log_info "创建 hadoop 组成功"
    fi
    
    # 创建 hadoop 用户
    sudo useradd -g hadoop -d /home/hadoop -m -s /bin/bash hadoop
    log_info "创建 hadoop 用户成功"
    
    # 设置用户密码
    echo "hadoop:hadoop123" | sudo chpasswd
    log_info "设置 hadoop 用户密码成功"
    
    # 添加 sudo 权限
    echo "hadoop ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/hadoop
    log_info "配置 hadoop 用户 sudo 权限成功"
}

# 创建目录结构
create_directories() {
    log_info "创建目录结构..."
    
    # 创建安装目录
    sudo mkdir -p "${HADOOP_HOME}"
    sudo mkdir -p "${HADOOP_DATA_DIR}"/{namenode,datanode,tmp,logs}
    
    # 设置目录权限
    sudo chown -R hadoop:hadoop "${HADOOP_HOME}"
    sudo chown -R hadoop:hadoop "${HADOOP_DATA_DIR}"
    
    # 设置目录权限
    sudo chmod 755 "${HADOOP_DATA_DIR}"/{namenode,datanode,tmp,logs}
    
    log_info "目录结构创建完成"
}

# 下载和安装 Hadoop
download_and_install_hadoop() {
    log_info "下载和安装 Hadoop ${HADOOP_VERSION}..."
    
    local temp_dir="/tmp/hadoop-install"
    mkdir -p "${temp_dir}"
    cd "${temp_dir}"
    
    # 检查是否已下载
    if [[ ! -f "hadoop-${HADOOP_VERSION}.tar.gz" ]]; then
        log_info "下载 Hadoop ${HADOOP_VERSION}..."
        if ! wget "${HADOOP_URL}"; then
            error_exit "下载 Hadoop 失败"
        fi
        
        # 下载校验文件
        if ! wget "${HADOOP_URL}.sha512"; then
            log_warn "下载校验文件失败，跳过校验"
        else
            log_info "验证下载文件完整性..."
            if ! sha512sum -c "hadoop-${HADOOP_VERSION}.tar.gz.sha512"; then
                error_exit "文件校验失败"
            fi
            log_info "文件校验成功"
        fi
    else
        log_info "Hadoop 安装包已存在，跳过下载"
    fi
    
    # 解压安装
    log_info "解压 Hadoop 到 ${HADOOP_HOME}..."
    sudo tar -xzf "hadoop-${HADOOP_VERSION}.tar.gz" -C /opt/
    sudo mv "/opt/hadoop-${HADOOP_VERSION}" "${HADOOP_HOME}"
    sudo chown -R hadoop:hadoop "${HADOOP_HOME}"
    
    log_info "Hadoop 安装完成"
}

# 配置环境变量
configure_environment() {
    log_info "配置环境变量..."
    
    # 配置 hadoop 用户的环境变量
    sudo -u hadoop tee -a /home/hadoop/.bashrc > /dev/null << EOF

# Hadoop 环境变量
export JAVA_HOME=${JAVA_HOME}
export HADOOP_HOME=${HADOOP_HOME}
export HADOOP_CONF_DIR=\$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=${HADOOP_DATA_DIR}/logs
export YARN_LOG_DIR=${HADOOP_DATA_DIR}/logs
export PATH=\$PATH:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin

# Hadoop 别名
alias hstart='start-dfs.sh && start-yarn.sh'
alias hstop='stop-yarn.sh && stop-dfs.sh'
alias hstatus='hdfs dfsadmin -report && yarn node -list'
EOF
    
    log_info "环境变量配置完成"
}

# 生成配置文件
generate_config_files() {
    log_info "生成 Hadoop 配置文件..."
    
    local conf_dir="${HADOOP_HOME}/etc/hadoop"
    
    # 配置 core-site.xml
    sudo -u hadoop tee "${conf_dir}/core-site.xml" > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
    Hadoop 核心配置文件
    配置 HDFS 的基本参数和默认文件系统
    
    生成时间: $(date '+%Y-%m-%d %H:%M:%S')
    配置模式: 单机模式
-->
<configuration>
    <!-- 默认文件系统，指向本地 HDFS -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
        <description>默认文件系统 URI，客户端连接的入口点</description>
    </property>
    
    <!-- Hadoop 临时目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/data/hadoop/tmp</value>
        <description>Hadoop 临时文件存储目录</description>
    </property>
    
    <!-- I/O 缓冲区大小 -->
    <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
        <description>文件 I/O 缓冲区大小，提升性能</description>
    </property>
    
    <!-- 启用压缩 -->
    <property>
        <name>io.compression.codecs</name>
        <value>org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.LzoCodec,org.apache.hadoop.io.compress.GzipCodec</value>
        <description>支持的压缩编解码器</description>
    </property>
    
    <!-- 网络优化 -->
    <property>
        <name>ipc.server.tcpnodelay</name>
        <value>true</value>
        <description>禁用 Nagle 算法，降低延迟</description>
    </property>
</configuration>
EOF
    
    # 配置 hdfs-site.xml
    sudo -u hadoop tee "${conf_dir}/hdfs-site.xml" > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
    HDFS 配置文件
    配置 NameNode 和 DataNode 的参数
    
    生成时间: $(date '+%Y-%m-%d %H:%M:%S')
    配置模式: 单机模式
-->
<configuration>
    <!-- 副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
        <description>文件副本数量，单机模式设置为 1</description>
    </property>
    
    <!-- NameNode 数据目录 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/data/hadoop/namenode</value>
        <description>NameNode 元数据存储目录</description>
    </property>
    
    <!-- DataNode 数据目录 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/data/hadoop/datanode</value>
        <description>DataNode 数据块存储目录</description>
    </property>
    
    <!-- 块大小 -->
    <property>
        <name>dfs.blocksize</name>
        <value>268435456</value>
        <description>HDFS 块大小，256MB</description>
    </property>
    
    <!-- NameNode Web UI 端口 -->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>0.0.0.0:9870</value>
        <description>NameNode Web UI 访问地址</description>
    </property>
    
    <!-- DataNode Web UI 端口 -->
    <property>
        <name>dfs.datanode.http.address</name>
        <value>0.0.0.0:9864</value>
        <description>DataNode Web UI 访问地址</description>
    </property>
    
    <!-- 权限检查 -->
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
        <description>禁用权限检查，简化单机部署</description>
    </property>
    
    <!-- 数据完整性检查 -->
    <property>
        <name>dfs.datanode.scan.period.hours</name>
        <value>168</value>
        <description>DataNode 扫描周期，7天</description>
    </property>
</configuration>
EOF
    
    # 配置 yarn-site.xml
    sudo -u hadoop tee "${conf_dir}/yarn-site.xml" > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!--
    YARN 配置文件
    配置资源管理器和节点管理器参数
    
    生成时间: $(date '+%Y-%m-%d %H:%M:%S')
    配置模式: 单机模式
-->
<configuration>
    <!-- ResourceManager 地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>localhost</value>
        <description>ResourceManager 主机名</description>
    </property>
    
    <!-- NodeManager 辅助服务 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
        <description>NodeManager 辅助服务</description>
    </property>
    
    <!-- NodeManager 内存配置 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>8192</value>
        <description>NodeManager 可用内存</description>
    </property>
    
    <!-- 容器最小内存 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1024</value>
        <description>容器最小内存分配</description>
    </property>
    
    <!-- 容器最大内存 -->
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>8192</value>
        <description>容器最大内存分配</description>
    </property>
    
    <!-- NodeManager CPU 配置 -->
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>4</value>
        <description>NodeManager 可用 CPU 核心数</description>
    </property>
</configuration>
EOF
    
    # 配置 mapred-site.xml
    sudo -u hadoop tee "${conf_dir}/mapred-site.xml" > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!--
    MapReduce 配置文件
    配置 MapReduce 作业执行参数
    
    生成时间: $(date '+%Y-%m-%d %H:%M:%S')
    配置模式: 单机模式
-->
<configuration>
    <!-- MapReduce 框架 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <description>MapReduce 运行在 YARN 上</description>
    </property>
    
    <!-- JobHistory Server 地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>localhost:10020</value>
        <description>JobHistory Server RPC 地址</description>
    </property>
    
    <!-- JobHistory Web UI -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>localhost:19888</value>
        <description>JobHistory Web UI 地址</description>
    </property>
    
    <!-- Map 任务内存 -->
    <property>
        <name>mapreduce.map.memory.mb</name>
        <value>2048</value>
        <description>Map 任务内存大小</description>
    </property>
    
    <!-- Reduce 任务内存 -->
    <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>2048</value>
        <description>Reduce 任务内存大小</description>
    </property>
</configuration>
EOF
    
    # 配置 hadoop-env.sh
    sudo -u hadoop tee -a "${conf_dir}/hadoop-env.sh" > /dev/null << EOF

# Java 环境配置
export JAVA_HOME=${JAVA_HOME}

# Hadoop 进程 JVM 参数
export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true"

# NameNode JVM 参数
export HADOOP_NAMENODE_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:${HADOOP_DATA_DIR}/logs/namenode-gc.log"

# DataNode JVM 参数
export HADOOP_DATANODE_OPTS="-Xms1g -Xmx1g -XX:+UseG1GC"

# ResourceManager JVM 参数
export YARN_RESOURCEMANAGER_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC"

# NodeManager JVM 参数
export YARN_NODEMANAGER_OPTS="-Xms1g -Xmx1g -XX:+UseG1GC"

# 日志目录
export HADOOP_LOG_DIR=${HADOOP_DATA_DIR}/logs
export YARN_LOG_DIR=${HADOOP_DATA_DIR}/logs
EOF
    
    log_info "配置文件生成完成"
}

# 配置防火墙
configure_firewall() {
    log_info "配置防火墙规则..."
    
    # 检查防火墙状态
    if command -v firewall-cmd &> /dev/null; then
        if sudo firewall-cmd --state &> /dev/null; then
            log_info "配置 firewalld 规则..."
            
            # Hadoop 端口
            sudo firewall-cmd --permanent --add-port=9000/tcp  # NameNode RPC
            sudo firewall-cmd --permanent --add-port=9870/tcp  # NameNode Web UI
            sudo firewall-cmd --permanent --add-port=9864/tcp  # DataNode Web UI
            sudo firewall-cmd --permanent --add-port=8088/tcp  # ResourceManager Web UI
            sudo firewall-cmd --permanent --add-port=8042/tcp  # NodeManager Web UI
            sudo firewall-cmd --permanent --add-port=19888/tcp # JobHistory Web UI
            
            # 重新加载防火墙规则
            sudo firewall-cmd --reload
            log_info "防火墙规则配置完成"
        else
            log_info "firewalld 未运行，跳过防火墙配置"
        fi
    elif command -v ufw &> /dev/null; then
        log_info "配置 ufw 规则..."
        sudo ufw allow 9000/tcp
        sudo ufw allow 9870/tcp
        sudo ufw allow 9864/tcp
        sudo ufw allow 8088/tcp
        sudo ufw allow 8042/tcp
        sudo ufw allow 19888/tcp
        log_info "ufw 规则配置完成"
    else
        log_warn "未检测到防火墙管理工具，请手动配置防火墙规则"
    fi
}

# 格式化 NameNode
format_namenode() {
    log_info "格式化 NameNode..."
    
    # 切换到 hadoop 用户执行
    sudo -u hadoop bash -c "
        source /home/hadoop/.bashrc
        hdfs namenode -format -force
    "
    
    if [[ $? -eq 0 ]]; then
        log_info "NameNode 格式化成功"
    else
        error_exit "NameNode 格式化失败"
    fi
}

# 启动 Hadoop 服务
start_hadoop_services() {
    log_info "启动 Hadoop 服务..."
    
    # 切换到 hadoop 用户启动服务
    sudo -u hadoop bash -c "
        source /home/hadoop/.bashrc
        
        # 启动 HDFS
        start-dfs.sh
        
        # 启动 YARN
        start-yarn.sh
        
        # 启动 JobHistory Server
        mapred --daemon start historyserver
    "
    
    # 等待服务启动
    sleep 10
    
    log_info "Hadoop 服务启动完成"
}

# 验证安装
verify_installation() {
    log_info "验证 Hadoop 安装..."
    
    # 检查进程
    log_info "检查 Hadoop 进程..."
    sudo -u hadoop jps
    
    # 检查 HDFS 状态
    log_info "检查 HDFS 状态..."
    sudo -u hadoop bash -c "
        source /home/hadoop/.bashrc
        hdfs dfsadmin -report
    "
    
    # 检查 YARN 状态
    log_info "检查 YARN 状态..."
    sudo -u hadoop bash -c "
        source /home/hadoop/.bashrc
        yarn node -list
    "
    
    # 创建测试目录和文件
    log_info "执行功能测试..."
    sudo -u hadoop bash -c "
        source /home/hadoop/.bashrc
        
        # 创建测试目录
        hdfs dfs -mkdir -p /test
        
        # 创建测试文件
        echo 'Hello Hadoop HDFS!' > /tmp/test.txt
        hdfs dfs -put /tmp/test.txt /test/
        
        # 验证文件内容
        hdfs dfs -cat /test/test.txt
        
        # 清理测试文件
        rm -f /tmp/test.txt
    "
    
    log_info "Hadoop 安装验证完成"
}

# 生成启动脚本
generate_service_scripts() {
    log_info "生成服务管理脚本..."
    
    # 创建启动脚本
    sudo tee /usr/local/bin/hadoop-start > /dev/null << 'EOF'
#!/bin/bash
# Hadoop 服务启动脚本

echo "启动 Hadoop 服务..."
sudo -u hadoop bash -c "
    source /home/hadoop/.bashrc
    start-dfs.sh
    start-yarn.sh
    mapred --daemon start historyserver
"
echo "Hadoop 服务启动完成"
EOF
    
    # 创建停止脚本
    sudo tee /usr/local/bin/hadoop-stop > /dev/null << 'EOF'
#!/bin/bash
# Hadoop 服务停止脚本

echo "停止 Hadoop 服务..."
sudo -u hadoop bash -c "
    source /home/hadoop/.bashrc
    mapred --daemon stop historyserver
    stop-yarn.sh
    stop-dfs.sh
"
echo "Hadoop 服务停止完成"
EOF
    
    # 创建状态检查脚本
    sudo tee /usr/local/bin/hadoop-status > /dev/null << 'EOF'
#!/bin/bash
# Hadoop 服务状态检查脚本

echo "=== Hadoop 进程状态 ==="
sudo -u hadoop jps

echo -e "\n=== HDFS 状态 ==="
sudo -u hadoop bash -c "
    source /home/hadoop/.bashrc
    hdfs dfsadmin -report
"

echo -e "\n=== YARN 状态 ==="
sudo -u hadoop bash -c "
    source /home/hadoop/.bashrc
    yarn node -list
"

echo -e "\n=== Web UI 访问地址 ==="
echo "NameNode Web UI: http://$(hostname -I | awk '{print $1}'):9870"
echo "ResourceManager Web UI: http://$(hostname -I | awk '{print $1}'):8088"
echo "JobHistory Web UI: http://$(hostname -I | awk '{print $1}'):19888"
EOF
    
    # 设置执行权限
    sudo chmod +x /usr/local/bin/hadoop-{start,stop,status}
    
    log_info "服务管理脚本生成完成"
}

# 显示安装总结
show_installation_summary() {
    log_info "Hadoop 安装完成！"
    
    echo -e "\n${GREEN}=== 安装总结 ===${NC}"
    echo -e "${BLUE}Hadoop 版本:${NC} ${HADOOP_VERSION}"
    echo -e "${BLUE}安装目录:${NC} ${HADOOP_HOME}"
    echo -e "${BLUE}数据目录:${NC} ${HADOOP_DATA_DIR}"
    echo -e "${BLUE}配置目录:${NC} ${HADOOP_HOME}/etc/hadoop"
    echo -e "${BLUE}日志目录:${NC} ${HADOOP_DATA_DIR}/logs"
    
    echo -e "\n${GREEN}=== Web UI 访问地址 ===${NC}"
    local ip_address
    ip_address=$(hostname -I | awk '{print $1}')
    echo -e "${BLUE}NameNode Web UI:${NC} http://${ip_address}:9870"
    echo -e "${BLUE}ResourceManager Web UI:${NC} http://${ip_address}:8088"
    echo -e "${BLUE}JobHistory Web UI:${NC} http://${ip_address}:19888"
    
    echo -e "\n${GREEN}=== 常用命令 ===${NC}"
    echo -e "${BLUE}启动服务:${NC} hadoop-start"
    echo -e "${BLUE}停止服务:${NC} hadoop-stop"
    echo -e "${BLUE}查看状态:${NC} hadoop-status"
    echo -e "${BLUE}切换用户:${NC} sudo su - hadoop"
    
    echo -e "\n${GREEN}=== 基本操作示例 ===${NC}"
    echo -e "${BLUE}查看 HDFS 文件:${NC} hdfs dfs -ls /"
    echo -e "${BLUE}创建目录:${NC} hdfs dfs -mkdir /user"
    echo -e "${BLUE}上传文件:${NC} hdfs dfs -put localfile /user/"
    echo -e "${BLUE}下载文件:${NC} hdfs dfs -get /user/file localfile"
    
    echo -e "\n${YELLOW}注意事项:${NC}"
    echo "1. 默认用户名/密码: hadoop/hadoop123"
    echo "2. 请及时修改默认密码"
    echo "3. 生产环境请启用安全认证"
    echo "4. 定期备份 NameNode 元数据"
    
    echo -e "\n${GREEN}安装日志:${NC} ${LOG_FILE}"
}

# 主函数
main() {
    log_info "开始 Hadoop HDFS ${HADOOP_VERSION} 单机部署安装..."
    
    # 创建日志目录
    sudo mkdir -p "$(dirname "${LOG_FILE}")"
    sudo touch "${LOG_FILE}"
    sudo chmod 666 "${LOG_FILE}"
    
    # 执行安装步骤
    check_root
    check_system_requirements
    create_hadoop_user
    create_directories
    download_and_install_hadoop
    configure_environment
    generate_config_files
    configure_firewall
    format_namenode
    start_hadoop_services
    verify_installation
    generate_service_scripts
    show_installation_summary
    
    log_info "Hadoop HDFS ${HADOOP_VERSION} 安装完成！"
}

# 脚本入口
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi 